package com.ruoyi.ManagerApi.service.impl;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.datascope.annotation.DataScope;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import com.ruoyi.ManagerApi.mapper.TTpManufacturerMapper;
import com.ruoyi.ManagerApi.domain.TTpManufacturer;
import com.ruoyi.ManagerApi.service.ITTpManufacturerService;
import org.springframework.http.*;
import org.springframework.util.DigestUtils;
import org.springframework.web.client.RestTemplate;

import static com.ruoyi.common.security.utils.SecurityUtils.getLoginUser;

/**
 * 接口管理厂家信息Service业务层处理
 *
 * @author li
 * @date 2025-09-11
 */
@Service
public class TTpManufacturerServiceImpl implements ITTpManufacturerService {
    @Autowired
    private TTpManufacturerMapper tTpManufacturerMapper;
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 查询接口管理厂家信息
     *
     * @param id 接口管理厂家信息主键
     * @return 接口管理厂家信息
     */
    @Override
    public TTpManufacturer selectTTpManufacturerById(String id) {
        return tTpManufacturerMapper.selectTTpManufacturerById(id);
    }

    /**
     * 查询接口管理厂家信息列表
     *
     * @param tTpManufacturer 接口管理厂家信息
     * @return 接口管理厂家信息
     */
    @Override
    @DataScope(deptAlias = "m")
    public List<TTpManufacturer> selectTTpManufacturerList(TTpManufacturer tTpManufacturer) {
        return tTpManufacturerMapper.selectTTpManufacturerList(tTpManufacturer);
    }

    /**
     * 新增接口管理厂家信息
     *
     * @param tTpManufacturer 接口管理厂家信息
     * @return 结果
     */
    @Override
    public int insertTTpManufacturer(TTpManufacturer tTpManufacturer) {
        tTpManufacturer.setCreateBy(getLoginUser().getUsername());
        tTpManufacturer.setCreateTime(DateUtils.getNowDate());
        return tTpManufacturerMapper.insertTTpManufacturer(tTpManufacturer);
    }

    /**
     * 修改接口管理厂家信息
     *
     * @param tTpManufacturer 接口管理厂家信息
     * @return 结果
     */
    @Override
    public int updateTTpManufacturer(TTpManufacturer tTpManufacturer) {
        tTpManufacturer.setUpdateBy(getLoginUser().getUsername());
        tTpManufacturer.setUpdateTime(DateUtils.getNowDate());
        return tTpManufacturerMapper.updateTTpManufacturer(tTpManufacturer);
    }

    /**
     * 批量删除接口管理厂家信息
     *
     * @param ids 需要删除的接口管理厂家信息主键
     * @return 结果
     */
    @Override
    public int deleteTTpManufacturerByIds(String[] ids) {
        return tTpManufacturerMapper.deleteTTpManufacturerByIds(ids);
    }

    /**
     * 删除接口管理厂家信息信息
     *
     * @param id 接口管理厂家信息主键
     * @return 结果
     */
    @Override
    public int deleteTTpManufacturerById(String id) {
        return tTpManufacturerMapper.deleteTTpManufacturerById(id);
    }

    @Override
    public boolean connection(String id) {
        // 1. 获取接口信息
        TTpManufacturer manufacturer = tTpManufacturerMapper.selectTTpManufacturerById(id);
        try {
            // 1. 构造请求头
            HttpHeaders headers = new HttpHeaders();
            // 处理请求头
            if (StringUtils.isNotEmpty(manufacturer.getHeaders()) && !"0".equals(manufacturer.getHeaders())) {
                JSONObject headerJson = JSON.parseObject(manufacturer.getHeaders());
                for (String key : headerJson.keySet()) {
                    headers.add(key, headerJson.getString(key));
                }
            }
            // 设置内容类型
            if (StringUtils.isNotEmpty(manufacturer.getRestType()) && !"0".equals(manufacturer.getRestType())) {
                headers.setContentType(MediaType.valueOf(manufacturer.getRestType()));
            } else {
                headers.setContentType(MediaType.APPLICATION_JSON);
            }
            // 2. 构造请求体
            String requestBody = "";
            HttpMethod httpMethod = null;
            String apiUrl = "";
            // 判断是否为海康请求
            boolean isHikRequest = (manufacturer.getTokenUrl() != null && manufacturer.getTokenUrl().contains("HIK"));
            //判断是否是大华请求，大小写转换匹配
            boolean isDahuaRequest = (manufacturer.getTokenUrl() != null && manufacturer.getTokenUrl().contains("DAHUA"));
            if (isHikRequest) {
                // 海康请求特殊处理
                try {
                    InetAddress address = InetAddress.getByName(manufacturer.getApiUrl());
                    boolean reachable = address.isReachable(5000);// 3秒超时
                    if (reachable) {
                        updateManufacturerState(id, 1L);
                    } else {
                        updateManufacturerState(id, 0L);
                    }
                    return reachable;
                } catch (Exception e) {
                    return false;
                }
            } else if (isDahuaRequest) {
                // 大华请求特殊处理
                try {
                    InetAddress address = InetAddress.getByName(manufacturer.getApiUrl());
                    boolean reachable = address.isReachable(5000);// 3秒超时
                    if (reachable) {
                        updateManufacturerState(id, 1L);
                    } else {
                        updateManufacturerState(id, 0L);
                    }
                    return reachable;
                } catch (Exception e) {
                    return false;
                }
            } else {
                // 其他厂家通用处理
                requestBody = StringUtils.isNotEmpty(manufacturer.getTokenJson()) && !"0".equals(manufacturer.getTokenJson()) ?
                        manufacturer.getTokenJson() : "{}";
                httpMethod = HttpMethod.valueOf(manufacturer.getMethod().toUpperCase());
                apiUrl = manufacturer.getApiUrl() + manufacturer.getTokenUrl();
            }
            if (httpMethod == null) {
                throw new ServiceException("不支持的请求方法: " + manufacturer.getMethod());
            }
            // 3. 创建请求实体
            HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);
            // 4. 发送请求
            ResponseEntity<String> response = restTemplate.exchange(
                    apiUrl,
                    httpMethod,
                    requestEntity,
                    String.class
            );
            // 5. 处理响应
            if (response.getStatusCode().is2xxSuccessful()) {
                updateManufacturerState(id, 1L);
                return true;
            } else {
                updateManufacturerState(id, 0L);
                return false;
            }
        } catch (Exception e) {
            updateManufacturerState(id, 0L);
            e.printStackTrace();
            return false;
        }
    }

    // 更新厂家状态
    private void updateManufacturerState(String id, Long state) {
        TTpManufacturer tTpManufacturer = new TTpManufacturer();
        tTpManufacturer.setId(Long.valueOf(id));
        tTpManufacturer.setState(state);
        tTpManufacturerMapper.updateTTpManufacturer(tTpManufacturer);
    }
}